前言
简要记录了Android5.1设备驱动的调试记录,以led为例,记录了HAL、Framework层的处理,并对调用关系进行了简要分析。 # HAL Layer 1.g6818_lollipop_v51> 创建led.h头文件
2.Z:6818171606818_lollipop_v51> 创建led文件夹 > led.c > Android.mk
3.编译 > source build/envsetup.sh > lunch 选择 21. g6818-userdebug > mmm hardware/libhardware/modules/led/ > ll out/target/product/g6818/system/lib/hw/
Frameworks Layer
1.创建JNI接口 1.1 创建frameworks/base/services/core/jni/com_android_server_LedService.cpp 1.2 修改frameworks/base/services/core/jni/onload.cpp添加注册native接口 1.3 修改frameworks/base/services/core/jni/Android.mk 添加"com_android_server_LedService.cpp"项
注意: LedService.java的java接口的入参、返回值类型一定要与com_android_server_LedService.cpp的native函数一致 否则,main.txt日志会报注册JNI接口失败"Failed to register native method" 导致zygote初始化失败,反复init
2.创建frameworks/base/services/core/java/com/android/server/LedService.java 实现服务类 修改frameworks/base/services/java/com/android/server/SystemServer.java 注册Led服务到Service Manager中
3.生成ILedService.java服务接口类 3.1 创建frameworks/base/core/java/android/os/ILedService.aidl 3.2 修改frameworks/base/Android.mk 添加编译项"core/java/android/os/ILedService.aidl" 3.3 编译 mmm frameworks/base/
4.编译mmm frameworks/base/services/ ll out/target/product/g6818/system/lib/libandroid_servers.so
框架分析
调用关系(自顶向下): > 1.应用Activity private ILedService iLedService = ILedService.Stub.asInterface(ServiceManager.getService("led")) Client进程通过ServiceManager(Binder,Stub)向Server进程请求已注册的Led服务 2.iLedService.LedOpen()调用JNI接口,JNI转C++接口 3.C++接口通过int hw_get_module(const char *id, const struct hw_module_t **module) 加载HAL动态库led.default.so dlsym()获取动态库led.default.so中HAL_MODULE_INFO_SYM符号表的入口地址 即struct led_module_t的地址 4.通过句柄直接调用驱动api接口->内核驱动
具体实现(自底向上):
> 1.HAL层实现Led.c,直接和内核交互 2.为对接Framework和HAL层,通过JNI机制,创建com_android_server_LedService.cpp实现JNI native接口 3.创建LedService.java 实现服务类,修改SystemServer.java 注册Led服务到Service Manager中 该类中声明了native_LedOpen(),native_LedOn(),native_LedOff()向下对接JNI native接口 4.创建ILedService.aidl(Android Interface Definition Language)文件,编译生成ILedService.java接口类 APP进程依靠Binder机制,通过已注册的服务名称,获取该接口类